/*
 * style.cpp
 *
 *  Created on: 03.07.2012
 *      Author: Caffeine
 */


#include "style.h"
#include "../CXMLFactoryEnvironment.h"
#include <lampe/xml/IFactoryRecord.h>
#include <lampe/xml/IXmlNode.h>
#include <lampe/StringUtils.h>
#include "style_item.h"

namespace lampe{
namespace xml{

StyleFactoryRecord::style_rect::style_rect(){
	name="";
	value="";
}

StyleFactoryRecord::style_rect::style_rect(lampe::String n,lampe::String v){
	name=n;
	value=v;
}

void StyleFactoryRecord::style_rect::addTo(lampe::xml::IXmlNode*node){
	if (node->indexOfAttribute(name)<0)
		node->addAttribute(name,value);
}


StyleFactoryRecord::style_item::style_item(lampe::String n){
	name=n;
}

void StyleFactoryRecord::style_item::addTo(lampe::xml::IXmlNode*node){
	for (lampe::u32 i=0;i<list.size();i++)
		list[i].addTo(node);
}

void StyleFactoryRecord::style_item::setParent(style_item node){
	for (lampe::u32 i=0;i<node.list.size();i++)
		list.push_back(node.list[i]);
}

void StyleFactoryRecord::style_item::add(lampe::String name,lampe::String value){
	style_rect r(name,value);
	list.push_back(r);
}

	


lampe::s32 StyleFactoryRecord::getStyleByName(lampe::String name){
	for (lampe::u32 i=0;i<styles.size();i++)
		if (styles[i].name==name)
			return i;
	return -1;
}

void StyleFactoryRecord::addStyleRecord(void*style,lampe::String name,lampe::String value){
	style_item*item=(style_item*)style;
	item->add(name,value);
}

void StyleFactoryRecord::addStyleRecord(lampe::String style,lampe::String name,lampe::String value){
	lampe::s32 index=getStyleByName(name);
	if (index<0)
		return;
	addStyleRecord(&styles[index],name,value);
}


LAMPE_VECTOR_VENDOR<String> StyleFactoryRecord::getProcessedTags(){
	LAMPE_VECTOR_VENDOR<String> res;
	res.push_back("style");
	return res;
};
LAMPE_VECTOR_VENDOR<String> StyleFactoryRecord::getProcessedAttributes(){
	LAMPE_VECTOR_VENDOR<String> res;
	res.push_back("style");
	return res;
};

	//-----------------------------------------------------------------------//
	
lampe::xml::TagResult StyleFactoryRecord::tagHandlerBefor(lampe::xml::IXMLFactoryEnvironment*environment,lampe::xml::IXmlNode*node){
	printf("process tag \"STYLE\"\n");
	lampe::s32 index=node->indexOfAttribute("name");
	if (index<0){//если атрибут name не указан в тэге
		if (node->getParent()){
			//node->getParent()->removeNode(node);
			return lampe::xml::NEXT;
		}
		return lampe::xml::STOP;
	}
	if (getStyleByName(node->getAttribute(index)->getString())>=0){//тэг с таким же имянем уже существует
		if (node->getParent()){
			//node->getParent()->removeNode(node);
			return lampe::xml::NEXT;
		}
		return lampe::xml::STOP;
	}
	style_item style(node->getAttribute(index)->getString());
		lampe::s32 iparent=node->indexOfAttribute("parent");
	if (iparent>=0){
		lampe::s32 parent_style_index=getStyleByName(node->getAttribute(iparent)->getString());
		if (parent_style_index>=0){
			style.setParent(styles[parent_style_index]);
		}
	}
	styles.push_back(style);
	node->setTag((void*)&styles[styles.size()-1]);
	if (node->getParent()){
		//node->getParent()->removeNode(node);
		return lampe::xml::NEXT;
	}
	return lampe::xml::STOP;
}

lampe::xml::TagResult StyleFactoryRecord::tagHandlerAfter(lampe::xml::IXMLFactoryEnvironment*environment,lampe::xml::IXmlNode*node){
	if (!node->getParent())
		return lampe::xml::STOP;
	node->getParent()->removeNode(node);
	return lampe::xml::BACK;
}

lampe::xml::TagResult StyleFactoryRecord::attributeHandler(lampe::xml::IXMLFactoryEnvironment*environment,lampe::xml::IXmlNode*node,lampe::u32 index){
	printf("process attribute \"STYLE\"\n");
	LAMPE_VECTOR_VENDOR<lampe::String> list;
	str::split(node->getAttribute(index)->getString(),&list,' ');
		for (lampe::u32 j=0;j<list.size();j++){
		lampe::s32 i=getStyleByName(list[j]);
		if (i<0){
			node->removeAttribute(index);
			return lampe::xml::BACK;
		}
		styles[i].addTo(node);
	}
	node->removeAttribute(index);
	return lampe::xml::BACK;
}


}//namespace xml
}//namespace lampe

void regStyle(lampe::xml::CXMLFactoryEnvironment*environment){
	lampe::xml::StyleFactoryRecord*temp=new lampe::xml::StyleFactoryRecord();
	environment->registerHandler(temp);
	regStyleItem(environment,temp);
	temp->drop();
}
